#include "ModuleHist.h"

void ModuleHist::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();

	sb_channel=new QSpinBox(win);
	sb_channel->setPrefix("canal=");
	sb_channel->setRange(1,1);

	sb_ranges=new QSpinBox(win);
	sb_ranges->setPrefix("plage=");
	sb_ranges->setRange(0,65536);
	sb_ranges->setValue(255);

	sb_histSize=new QSpinBox(win);
	sb_histSize->setPrefix("nb barres=");
	sb_histSize->setRange(0,65536);
	sb_histSize->setValue(255);

	cb_useMask=new QCheckBox("Utiliser un masque",win);
	cb_useMask->setChecked(false);

  layout=new QVBoxLayout(win);
	layout->addWidget(sb_histSize);
	layout->addWidget(sb_channel);
	layout->addWidget(sb_ranges);
	layout->addWidget(cb_useMask);
	
}
////////////////////////////////////////////////////////////////////////////////
void ModuleHist::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleHist::process()
{
	if(!currentFrame.empty())
	{	
		int histSize=sb_histSize->value();
		float range[]={0,sb_ranges->value()};
		const float * ranges[]={range,range};

		std::vector<cv::Mat> channels_splited;
		cv::split(currentFrame,channels_splited);

		if(!cb_useMask->isChecked())
		{
			cv::calcHist(&channels_splited[sb_channel->value()-1], 1, 0, cv::Mat(), hist, 1, &histSize, ranges);
		}
		else if(!mask.empty())
		{
			cv::calcHist(&channels_splited[sb_channel->value()-1], 1, 0, mask, hist, 1, &histSize, ranges);
		}
		else
		{
			hist.release();
		}
	
		if(!hist.empty())
		{
			//on normalise on doit pouvoir fair plus efficace
			float sum=0.0;
			for(int i=0;i<hist.rows;i++)sum+=hist(i);
			hist=hist/sum;
		}
	}
	return hist;
}
////////////////////////////////////////////////////////////////////////////////
void ModuleHist::setInput(int n,const cv::Mat & m)
{
	if(n==0)
	{	
		currentFrame=m.clone();
		if(!m.empty())
		{
			sb_channel->setRange(1,currentFrame.channels());
		}
	}
	else if(n==1)
	{
		mask=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleHist::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleHist::getName()
{
	return tr("Histogramme");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleHist::nbInputs()
{
	return 1+cb_useMask->isChecked();
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleHist::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==4)
	{
		sb_histSize->setValue(list_params[0].toInt());	
		sb_channel->setValue(list_params[1].toInt());	
		sb_ranges->setValue(list_params[2].toInt());	
		cb_useMask->setChecked(list_params[3].toInt());	
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleHist::getParams()
{
	return QString::number(sb_histSize->value())+tr(";")+
				 QString::number(sb_channel->value())+tr(";")+
				 QString::number(sb_ranges->value())+tr(";")+
				 QString::number(cb_useMask->isChecked());
}

QCVModuleInterface * ModuleHist::clone()
{
	return new ModuleHist;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleHist::help(int id)
{
	if(id==-2)
	{
		return trUtf8("Calcul l'histogramme par composantes de l'image en entrée");
	}
	else if(id==-1)
	{
		return tr("histogramme");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else if(id==1)
	{
		return tr("masque");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModuleHist_plugin,ModuleHist);  
